/*
 * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

#ifndef CLASSFILE_CONSTANTS_H
#define CLASSFILE_CONSTANTS_H

#ifdef __cplusplus
extern "C" {
#endif

/* Classfile version number for this information */
#define JVM_CLASSFILE_MAJOR_VERSION 52
#define JVM_CLASSFILE_MINOR_VERSION 0

/* Flags */

enum {
    JVM_ACC_PUBLIC = 0x0001,
    JVM_ACC_PRIVATE = 0x0002,
    JVM_ACC_PROTECTED = 0x0004,
    JVM_ACC_STATIC = 0x0008,
    JVM_ACC_FINAL = 0x0010,
    JVM_ACC_SYNCHRONIZED = 0x0020,
    JVM_ACC_SUPER = 0x0020,
    JVM_ACC_VOLATILE = 0x0040,
    JVM_ACC_BRIDGE = 0x0040,
    JVM_ACC_TRANSIENT = 0x0080,
    JVM_ACC_VARARGS = 0x0080,
    JVM_ACC_NATIVE = 0x0100,
    JVM_ACC_INTERFACE = 0x0200,
    JVM_ACC_ABSTRACT = 0x0400,
    JVM_ACC_STRICT = 0x0800,
    JVM_ACC_SYNTHETIC = 0x1000,
    JVM_ACC_ANNOTATION = 0x2000,
    JVM_ACC_ENUM = 0x4000
};

/* Used in newarray instruction. */

enum {
    JVM_T_BOOLEAN = 4,
    JVM_T_CHAR = 5,
    JVM_T_FLOAT = 6,
    JVM_T_DOUBLE = 7,
    JVM_T_BYTE = 8,
    JVM_T_SHORT = 9,
    JVM_T_INT = 10,
    JVM_T_LONG = 11
};

/* Constant Pool Entries */

enum {
    JVM_CONSTANT_Utf8 = 1,
    JVM_CONSTANT_Unicode = 2, /* unused */
    JVM_CONSTANT_Integer = 3,
    JVM_CONSTANT_Float = 4,
    JVM_CONSTANT_Long = 5,
    JVM_CONSTANT_Double = 6,
    JVM_CONSTANT_Class = 7,
    JVM_CONSTANT_String = 8,
    JVM_CONSTANT_Fieldref = 9,
    JVM_CONSTANT_Methodref = 10,
    JVM_CONSTANT_InterfaceMethodref = 11,
    JVM_CONSTANT_NameAndType = 12,
    JVM_CONSTANT_MethodHandle = 15,  // JSR 292
    JVM_CONSTANT_MethodType = 16,   // JSR 292
    JVM_CONSTANT_InvokeDynamic = 18
};

/* JVM_CONSTANT_MethodHandle subtypes */
enum {
    JVM_REF_getField = 1,
    JVM_REF_getStatic = 2,
    JVM_REF_putField = 3,
    JVM_REF_putStatic = 4,
    JVM_REF_invokeVirtual = 5,
    JVM_REF_invokeStatic = 6,
    JVM_REF_invokeSpecial = 7,
    JVM_REF_newInvokeSpecial = 8,
    JVM_REF_invokeInterface = 9
};

/* StackMapTable type item numbers */

enum {
    JVM_ITEM_Top = 0,
    JVM_ITEM_Integer = 1,
    JVM_ITEM_Float = 2,
    JVM_ITEM_Double = 3,
    JVM_ITEM_Long = 4,
    JVM_ITEM_Null = 5,
    JVM_ITEM_UninitializedThis = 6,
    JVM_ITEM_Object = 7,
    JVM_ITEM_Uninitialized = 8
};

/* Type signatures */

enum {
    JVM_SIGNATURE_ARRAY = '[',
    JVM_SIGNATURE_BYTE = 'B',
    JVM_SIGNATURE_CHAR = 'C',
    JVM_SIGNATURE_CLASS = 'L',
    JVM_SIGNATURE_ENDCLASS = ';',
    JVM_SIGNATURE_ENUM = 'E',
    JVM_SIGNATURE_FLOAT = 'F',
    JVM_SIGNATURE_DOUBLE = 'D',
    JVM_SIGNATURE_FUNC = '(',
    JVM_SIGNATURE_ENDFUNC = ')',
    JVM_SIGNATURE_INT = 'I',
    JVM_SIGNATURE_LONG = 'J',
    JVM_SIGNATURE_SHORT = 'S',
    JVM_SIGNATURE_VOID = 'V',
    JVM_SIGNATURE_BOOLEAN = 'Z'
};

/* Opcodes */

enum {
    JVM_OPC_nop = 0,
    JVM_OPC_aconst_null = 1,
    JVM_OPC_iconst_m1 = 2,
    JVM_OPC_iconst_0 = 3,
    JVM_OPC_iconst_1 = 4,
    JVM_OPC_iconst_2 = 5,
    JVM_OPC_iconst_3 = 6,
    JVM_OPC_iconst_4 = 7,
    JVM_OPC_iconst_5 = 8,
    JVM_OPC_lconst_0 = 9,
    JVM_OPC_lconst_1 = 10,
    JVM_OPC_fconst_0 = 11,
    JVM_OPC_fconst_1 = 12,
    JVM_OPC_fconst_2 = 13,
    JVM_OPC_dconst_0 = 14,
    JVM_OPC_dconst_1 = 15,
    JVM_OPC_bipush = 16,
    JVM_OPC_sipush = 17,
    JVM_OPC_ldc = 18,
    JVM_OPC_ldc_w = 19,
    JVM_OPC_ldc2_w = 20,
    JVM_OPC_iload = 21,
    JVM_OPC_lload = 22,
    JVM_OPC_fload = 23,
    JVM_OPC_dload = 24,
    JVM_OPC_aload = 25,
    JVM_OPC_iload_0 = 26,
    JVM_OPC_iload_1 = 27,
    JVM_OPC_iload_2 = 28,
    JVM_OPC_iload_3 = 29,
    JVM_OPC_lload_0 = 30,
    JVM_OPC_lload_1 = 31,
    JVM_OPC_lload_2 = 32,
    JVM_OPC_lload_3 = 33,
    JVM_OPC_fload_0 = 34,
    JVM_OPC_fload_1 = 35,
    JVM_OPC_fload_2 = 36,
    JVM_OPC_fload_3 = 37,
    JVM_OPC_dload_0 = 38,
    JVM_OPC_dload_1 = 39,
    JVM_OPC_dload_2 = 40,
    JVM_OPC_dload_3 = 41,
    JVM_OPC_aload_0 = 42,
    JVM_OPC_aload_1 = 43,
    JVM_OPC_aload_2 = 44,
    JVM_OPC_aload_3 = 45,
    JVM_OPC_iaload = 46,
    JVM_OPC_laload = 47,
    JVM_OPC_faload = 48,
    JVM_OPC_daload = 49,
    JVM_OPC_aaload = 50,
    JVM_OPC_baload = 51,
    JVM_OPC_caload = 52,
    JVM_OPC_saload = 53,
    JVM_OPC_istore = 54,
    JVM_OPC_lstore = 55,
    JVM_OPC_fstore = 56,
    JVM_OPC_dstore = 57,
    JVM_OPC_astore = 58,
    JVM_OPC_istore_0 = 59,
    JVM_OPC_istore_1 = 60,
    JVM_OPC_istore_2 = 61,
    JVM_OPC_istore_3 = 62,
    JVM_OPC_lstore_0 = 63,
    JVM_OPC_lstore_1 = 64,
    JVM_OPC_lstore_2 = 65,
    JVM_OPC_lstore_3 = 66,
    JVM_OPC_fstore_0 = 67,
    JVM_OPC_fstore_1 = 68,
    JVM_OPC_fstore_2 = 69,
    JVM_OPC_fstore_3 = 70,
    JVM_OPC_dstore_0 = 71,
    JVM_OPC_dstore_1 = 72,
    JVM_OPC_dstore_2 = 73,
    JVM_OPC_dstore_3 = 74,
    JVM_OPC_astore_0 = 75,
    JVM_OPC_astore_1 = 76,
    JVM_OPC_astore_2 = 77,
    JVM_OPC_astore_3 = 78,
    JVM_OPC_iastore = 79,
    JVM_OPC_lastore = 80,
    JVM_OPC_fastore = 81,
    JVM_OPC_dastore = 82,
    JVM_OPC_aastore = 83,
    JVM_OPC_bastore = 84,
    JVM_OPC_castore = 85,
    JVM_OPC_sastore = 86,
    JVM_OPC_pop = 87,
    JVM_OPC_pop2 = 88,
    JVM_OPC_dup = 89,
    JVM_OPC_dup_x1 = 90,
    JVM_OPC_dup_x2 = 91,
    JVM_OPC_dup2 = 92,
    JVM_OPC_dup2_x1 = 93,
    JVM_OPC_dup2_x2 = 94,
    JVM_OPC_swap = 95,
    JVM_OPC_iadd = 96,
    JVM_OPC_ladd = 97,
    JVM_OPC_fadd = 98,
    JVM_OPC_dadd = 99,
    JVM_OPC_isub = 100,
    JVM_OPC_lsub = 101,
    JVM_OPC_fsub = 102,
    JVM_OPC_dsub = 103,
    JVM_OPC_imul = 104,
    JVM_OPC_lmul = 105,
    JVM_OPC_fmul = 106,
    JVM_OPC_dmul = 107,
    JVM_OPC_idiv = 108,
    JVM_OPC_ldiv = 109,
    JVM_OPC_fdiv = 110,
    JVM_OPC_ddiv = 111,
    JVM_OPC_irem = 112,
    JVM_OPC_lrem = 113,
    JVM_OPC_frem = 114,
    JVM_OPC_drem = 115,
    JVM_OPC_ineg = 116,
    JVM_OPC_lneg = 117,
    JVM_OPC_fneg = 118,
    JVM_OPC_dneg = 119,
    JVM_OPC_ishl = 120,
    JVM_OPC_lshl = 121,
    JVM_OPC_ishr = 122,
    JVM_OPC_lshr = 123,
    JVM_OPC_iushr = 124,
    JVM_OPC_lushr = 125,
    JVM_OPC_iand = 126,
    JVM_OPC_land = 127,
    JVM_OPC_ior = 128,
    JVM_OPC_lor = 129,
    JVM_OPC_ixor = 130,
    JVM_OPC_lxor = 131,
    JVM_OPC_iinc = 132,
    JVM_OPC_i2l = 133,
    JVM_OPC_i2f = 134,
    JVM_OPC_i2d = 135,
    JVM_OPC_l2i = 136,
    JVM_OPC_l2f = 137,
    JVM_OPC_l2d = 138,
    JVM_OPC_f2i = 139,
    JVM_OPC_f2l = 140,
    JVM_OPC_f2d = 141,
    JVM_OPC_d2i = 142,
    JVM_OPC_d2l = 143,
    JVM_OPC_d2f = 144,
    JVM_OPC_i2b = 145,
    JVM_OPC_i2c = 146,
    JVM_OPC_i2s = 147,
    JVM_OPC_lcmp = 148,
    JVM_OPC_fcmpl = 149,
    JVM_OPC_fcmpg = 150,
    JVM_OPC_dcmpl = 151,
    JVM_OPC_dcmpg = 152,
    JVM_OPC_ifeq = 153,
    JVM_OPC_ifne = 154,
    JVM_OPC_iflt = 155,
    JVM_OPC_ifge = 156,
    JVM_OPC_ifgt = 157,
    JVM_OPC_ifle = 158,
    JVM_OPC_if_icmpeq = 159,
    JVM_OPC_if_icmpne = 160,
    JVM_OPC_if_icmplt = 161,
    JVM_OPC_if_icmpge = 162,
    JVM_OPC_if_icmpgt = 163,
    JVM_OPC_if_icmple = 164,
    JVM_OPC_if_acmpeq = 165,
    JVM_OPC_if_acmpne = 166,
    JVM_OPC_goto = 167,
    JVM_OPC_jsr = 168,
    JVM_OPC_ret = 169,
    JVM_OPC_tableswitch = 170,
    JVM_OPC_lookupswitch = 171,
    JVM_OPC_ireturn = 172,
    JVM_OPC_lreturn = 173,
    JVM_OPC_freturn = 174,
    JVM_OPC_dreturn = 175,
    JVM_OPC_areturn = 176,
    JVM_OPC_return = 177,
    JVM_OPC_getstatic = 178,
    JVM_OPC_putstatic = 179,
    JVM_OPC_getfield = 180,
    JVM_OPC_putfield = 181,
    JVM_OPC_invokevirtual = 182,
    JVM_OPC_invokespecial = 183,
    JVM_OPC_invokestatic = 184,
    JVM_OPC_invokeinterface = 185,
    JVM_OPC_invokedynamic = 186,
    JVM_OPC_new = 187,
    JVM_OPC_newarray = 188,
    JVM_OPC_anewarray = 189,
    JVM_OPC_arraylength = 190,
    JVM_OPC_athrow = 191,
    JVM_OPC_checkcast = 192,
    JVM_OPC_instanceof = 193,
    JVM_OPC_monitorenter = 194,
    JVM_OPC_monitorexit = 195,
    JVM_OPC_wide = 196,
    JVM_OPC_multianewarray = 197,
    JVM_OPC_ifnull = 198,
    JVM_OPC_ifnonnull = 199,
    JVM_OPC_goto_w = 200,
    JVM_OPC_jsr_w = 201,
    JVM_OPC_MAX = 201
};

/* Opcode length initializer, use with something like:
 *   unsigned char opcode_length[JVM_OPC_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER;
 */
#define JVM_OPCODE_LENGTH_INITIALIZER { \
   1,   /* nop */                       \
   1,   /* aconst_null */               \
   1,   /* iconst_m1 */                 \
   1,   /* iconst_0 */                  \
   1,   /* iconst_1 */                  \
   1,   /* iconst_2 */                  \
   1,   /* iconst_3 */                  \
   1,   /* iconst_4 */                  \
   1,   /* iconst_5 */                  \
   1,   /* lconst_0 */                  \
   1,   /* lconst_1 */                  \
   1,   /* fconst_0 */                  \
   1,   /* fconst_1 */                  \
   1,   /* fconst_2 */                  \
   1,   /* dconst_0 */                  \
   1,   /* dconst_1 */                  \
   2,   /* bipush */                    \
   3,   /* sipush */                    \
   2,   /* ldc */                       \
   3,   /* ldc_w */                     \
   3,   /* ldc2_w */                    \
   2,   /* iload */                     \
   2,   /* lload */                     \
   2,   /* fload */                     \
   2,   /* dload */                     \
   2,   /* aload */                     \
   1,   /* iload_0 */                   \
   1,   /* iload_1 */                   \
   1,   /* iload_2 */                   \
   1,   /* iload_3 */                   \
   1,   /* lload_0 */                   \
   1,   /* lload_1 */                   \
   1,   /* lload_2 */                   \
   1,   /* lload_3 */                   \
   1,   /* fload_0 */                   \
   1,   /* fload_1 */                   \
   1,   /* fload_2 */                   \
   1,   /* fload_3 */                   \
   1,   /* dload_0 */                   \
   1,   /* dload_1 */                   \
   1,   /* dload_2 */                   \
   1,   /* dload_3 */                   \
   1,   /* aload_0 */                   \
   1,   /* aload_1 */                   \
   1,   /* aload_2 */                   \
   1,   /* aload_3 */                   \
   1,   /* iaload */                    \
   1,   /* laload */                    \
   1,   /* faload */                    \
   1,   /* daload */                    \
   1,   /* aaload */                    \
   1,   /* baload */                    \
   1,   /* caload */                    \
   1,   /* saload */                    \
   2,   /* istore */                    \
   2,   /* lstore */                    \
   2,   /* fstore */                    \
   2,   /* dstore */                    \
   2,   /* astore */                    \
   1,   /* istore_0 */                  \
   1,   /* istore_1 */                  \
   1,   /* istore_2 */                  \
   1,   /* istore_3 */                  \
   1,   /* lstore_0 */                  \
   1,   /* lstore_1 */                  \
   1,   /* lstore_2 */                  \
   1,   /* lstore_3 */                  \
   1,   /* fstore_0 */                  \
   1,   /* fstore_1 */                  \
   1,   /* fstore_2 */                  \
   1,   /* fstore_3 */                  \
   1,   /* dstore_0 */                  \
   1,   /* dstore_1 */                  \
   1,   /* dstore_2 */                  \
   1,   /* dstore_3 */                  \
   1,   /* astore_0 */                  \
   1,   /* astore_1 */                  \
   1,   /* astore_2 */                  \
   1,   /* astore_3 */                  \
   1,   /* iastore */                   \
   1,   /* lastore */                   \
   1,   /* fastore */                   \
   1,   /* dastore */                   \
   1,   /* aastore */                   \
   1,   /* bastore */                   \
   1,   /* castore */                   \
   1,   /* sastore */                   \
   1,   /* pop */                       \
   1,   /* pop2 */                      \
   1,   /* dup */                       \
   1,   /* dup_x1 */                    \
   1,   /* dup_x2 */                    \
   1,   /* dup2 */                      \
   1,   /* dup2_x1 */                   \
   1,   /* dup2_x2 */                   \
   1,   /* swap */                      \
   1,   /* iadd */                      \
   1,   /* ladd */                      \
   1,   /* fadd */                      \
   1,   /* dadd */                      \
   1,   /* isub */                      \
   1,   /* lsub */                      \
   1,   /* fsub */                      \
   1,   /* dsub */                      \
   1,   /* imul */                      \
   1,   /* lmul */                      \
   1,   /* fmul */                      \
   1,   /* dmul */                      \
   1,   /* idiv */                      \
   1,   /* ldiv */                      \
   1,   /* fdiv */                      \
   1,   /* ddiv */                      \
   1,   /* irem */                      \
   1,   /* lrem */                      \
   1,   /* frem */                      \
   1,   /* drem */                      \
   1,   /* ineg */                      \
   1,   /* lneg */                      \
   1,   /* fneg */                      \
   1,   /* dneg */                      \
   1,   /* ishl */                      \
   1,   /* lshl */                      \
   1,   /* ishr */                      \
   1,   /* lshr */                      \
   1,   /* iushr */                     \
   1,   /* lushr */                     \
   1,   /* iand */                      \
   1,   /* land */                      \
   1,   /* ior */                       \
   1,   /* lor */                       \
   1,   /* ixor */                      \
   1,   /* lxor */                      \
   3,   /* iinc */                      \
   1,   /* i2l */                       \
   1,   /* i2f */                       \
   1,   /* i2d */                       \
   1,   /* l2i */                       \
   1,   /* l2f */                       \
   1,   /* l2d */                       \
   1,   /* f2i */                       \
   1,   /* f2l */                       \
   1,   /* f2d */                       \
   1,   /* d2i */                       \
   1,   /* d2l */                       \
   1,   /* d2f */                       \
   1,   /* i2b */                       \
   1,   /* i2c */                       \
   1,   /* i2s */                       \
   1,   /* lcmp */                      \
   1,   /* fcmpl */                     \
   1,   /* fcmpg */                     \
   1,   /* dcmpl */                     \
   1,   /* dcmpg */                     \
   3,   /* ifeq */                      \
   3,   /* ifne */                      \
   3,   /* iflt */                      \
   3,   /* ifge */                      \
   3,   /* ifgt */                      \
   3,   /* ifle */                      \
   3,   /* if_icmpeq */                 \
   3,   /* if_icmpne */                 \
   3,   /* if_icmplt */                 \
   3,   /* if_icmpge */                 \
   3,   /* if_icmpgt */                 \
   3,   /* if_icmple */                 \
   3,   /* if_acmpeq */                 \
   3,   /* if_acmpne */                 \
   3,   /* goto */                      \
   3,   /* jsr */                       \
   2,   /* ret */                       \
   99,  /* tableswitch */               \
   99,  /* lookupswitch */              \
   1,   /* ireturn */                   \
   1,   /* lreturn */                   \
   1,   /* freturn */                   \
   1,   /* dreturn */                   \
   1,   /* areturn */                   \
   1,   /* return */                    \
   3,   /* getstatic */                 \
   3,   /* putstatic */                 \
   3,   /* getfield */                  \
   3,   /* putfield */                  \
   3,   /* invokevirtual */             \
   3,   /* invokespecial */             \
   3,   /* invokestatic */              \
   5,   /* invokeinterface */           \
   5,   /* invokedynamic */             \
   3,   /* new */                       \
   2,   /* newarray */                  \
   3,   /* anewarray */                 \
   1,   /* arraylength */               \
   1,   /* athrow */                    \
   3,   /* checkcast */                 \
   3,   /* instanceof */                \
   1,   /* monitorenter */              \
   1,   /* monitorexit */               \
   0,   /* wide */                      \
   4,   /* multianewarray */            \
   3,   /* ifnull */                    \
   3,   /* ifnonnull */                 \
   5,   /* goto_w */                    \
   5    /* jsr_w */                     \
}

#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */

#endif /* CLASSFILE_CONSTANTS */
